home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -screenplay- / shareware / warpquake / warpquakesrc / d_part.c < prev    next >
C/C++ Source or Header  |  2000-02-29  |  4KB  |  208 lines

  1. /*
  2. Copyright (C) 1996-1997 Id Software, Inc.
  3.  
  4. This program is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License
  6. as published by the Free Software Foundation; either version 2
  7. of the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  12.  
  13. See the GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. */
  20. // d_part.c: software driver module for drawing particles
  21.  
  22. #include "quakedef.h"
  23. #include "d_local.h"
  24.  
  25.  
  26. /*
  27. ==============
  28. D_EndParticles
  29. ==============
  30. */
  31. void D_EndParticles (void)
  32. {
  33. // not used by software driver
  34. }
  35.  
  36.  
  37. /*
  38. ==============
  39. D_StartParticles
  40. ==============
  41. */
  42. void D_StartParticles (void)
  43. {
  44. // not used by software driver
  45. }
  46.  
  47.  
  48. #if    !id386
  49.  
  50. /*
  51. ==============
  52. D_DrawParticle
  53. ==============
  54. */
  55. void D_DrawParticle (particle_t *pparticle)
  56. {
  57.     vec3_t    local, transformed;
  58.     float    zi;
  59.     byte    *pdest;
  60.     short    *pz;
  61.     int        i, izi, pix, count, u, v;
  62.  
  63. // transform point
  64.     VectorSubtract (pparticle->org, r_origin, local);
  65.  
  66.     transformed[0] = DotProduct(local, r_pright);
  67.     transformed[1] = DotProduct(local, r_pup);
  68.     transformed[2] = DotProduct(local, r_ppn);        
  69.  
  70.     if (transformed[2] < PARTICLE_Z_CLIP)
  71.         return;
  72.  
  73. // project the point
  74. // FIXME: preadjust xcenter and ycenter
  75.     zi = 1.0 / transformed[2];
  76.     u = (int)(xcenter + zi * transformed[0] + 0.5);
  77.     v = (int)(ycenter - zi * transformed[1] + 0.5);
  78.  
  79.     if ((v > d_vrectbottom_particle) || 
  80.         (u > d_vrectright_particle) ||
  81.         (v < d_vrecty) ||
  82.         (u < d_vrectx))
  83.     {
  84.         return;
  85.     }
  86.  
  87.     pz = d_pzbuffer + (d_zwidth * v) + u;
  88.     pdest = d_viewbuffer + d_scantable[v] + u;
  89.     izi = (int)(zi * 0x8000);
  90.  
  91.     pix = izi >> d_pix_shift;
  92.  
  93.     if (pix < d_pix_min)
  94.         pix = d_pix_min;
  95.     else if (pix > d_pix_max)
  96.         pix = d_pix_max;
  97.  
  98.     switch (pix)
  99.     {
  100.     case 1:
  101.         count = 1 << d_y_aspect_shift;
  102.  
  103.         for ( ; count ; count--, pz += d_zwidth, pdest += screenwidth)
  104.         {
  105.             if (pz[0] <= izi)
  106.             {
  107.                 pz[0] = izi;
  108.                 pdest[0] = pparticle->color;
  109.             }
  110.         }
  111.         break;
  112.  
  113.     case 2:
  114.         count = 2 << d_y_aspect_shift;
  115.  
  116.         for ( ; count ; count--, pz += d_zwidth, pdest += screenwidth)
  117.         {
  118.             if (pz[0] <= izi)
  119.             {
  120.                 pz[0] = izi;
  121.                 pdest[0] = pparticle->color;
  122.             }
  123.  
  124.             if (pz[1] <= izi)
  125.             {
  126.                 pz[1] = izi;
  127.                 pdest[1] = pparticle->color;
  128.             }
  129.         }
  130.         break;
  131.  
  132.     case 3:
  133.         count = 3 << d_y_aspect_shift;
  134.  
  135.         for ( ; count ; count--, pz += d_zwidth, pdest += screenwidth)
  136.         {
  137.             if (pz[0] <= izi)
  138.             {
  139.                 pz[0] = izi;
  140.                 pdest[0] = pparticle->color;
  141.             }
  142.  
  143.             if (pz[1] <= izi)
  144.             {
  145.                 pz[1] = izi;
  146.                 pdest[1] = pparticle->color;
  147.             }
  148.  
  149.             if (pz[2] <= izi)
  150.             {
  151.                 pz[2] = izi;
  152.                 pdest[2] = pparticle->color;
  153.             }
  154.         }
  155.         break;
  156.  
  157.     case 4:
  158.         count = 4 << d_y_aspect_shift;
  159.  
  160.         for ( ; count ; count--, pz += d_zwidth, pdest += screenwidth)
  161.         {
  162.             if (pz[0] <= izi)
  163.             {
  164.                 pz[0] = izi;
  165.                 pdest[0] = pparticle->color;
  166.             }
  167.  
  168.             if (pz[1] <= izi)
  169.             {
  170.                 pz[1] = izi;
  171.                 pdest[1] = pparticle->color;
  172.             }
  173.  
  174.             if (pz[2] <= izi)
  175.             {
  176.                 pz[2] = izi;
  177.                 pdest[2] = pparticle->color;
  178.             }
  179.  
  180.             if (pz[3] <= izi)
  181.             {
  182.                 pz[3] = izi;
  183.                 pdest[3] = pparticle->color;
  184.             }
  185.         }
  186.         break;
  187.  
  188.     default:
  189.         count = pix << d_y_aspect_shift;
  190.  
  191.         for ( ; count ; count--, pz += d_zwidth, pdest += screenwidth)
  192.         {
  193.             for (i=0 ; i<pix ; i++)
  194.             {
  195.                 if (pz[i] <= izi)
  196.                 {
  197.                     pz[i] = izi;
  198.                     pdest[i] = pparticle->color;
  199.                 }
  200.             }
  201.         }
  202.         break;
  203.     }
  204. }
  205.  
  206. #endif    // !id386
  207.  
  208.